package com.lct;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    private Account  loginAcc;


    /**启动ATM系统，展示欢迎页面*/
    public void start(){
        while (true) {
            System.out.println("====欢迎您进入到了lct银行的ATM系统====");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("请输入操作对应的编号");
            int command = sc.nextInt();

            switch (command){
                case 1:
                    //登录
                    login();
                    break;

                case 2:
                    //开户
                    createAccount();
                    break;

                default:
                    System.out.println("您输入的指令没有对应的操作~~");
            }
        }
    }


    /**登录*/
    private void login() {
        System.out.println("====欢迎登录====");
        if(accounts.size() == 0){
            System.out.println("系统中没有账户信息，登录功能不可用");
            return;//系统中没有账户信息，登录功能不可用
        }

        while (true) {
            System.out.println("请输入您的卡号");
            String cardId = sc.next();
            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                System.out.println("您输入的登录卡号不存在，请确认");
            }else {
                while (true) {
                    System.out.println("请输入您的密码");
                    String password = sc.next();
                    if (acc.getPassword().equals(password)){
                        System.out.println("恭喜您，" + acc.getUserName() + "成功登录系统，您的卡号是" + acc.getCardId());
                        loginAcc = acc;
                        showUserCommand();
                        return;
                    }else {
                        System.out.println("您输入的密码不正确，请再次输入~~");
                    }
                }
            }
        }
    }


    /**显示登录后的界面*/
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.getUserName() + "欢迎您，您可以选择输入以下功能对应的代码来对您的账户操作");
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、修改密码");
            System.out.println("6、退出");
            System.out.println("7、注销当前账户");
            System.out.print("请输入：");
            int command = sc.nextInt();

            switch(command){
                case 1:
                    //查询
                    showLoginAccount();
                    break;
                case 2:
                    //存款
                    depositMoney();
                    break;
                case 3:
                    //取款
                    drawMoney();
                    break;
                case 4:
                    //转账
                    transferMoney();
                    break;
                case 5:
                    //修改密码
                    changePassword();
                    return;
                case 6:
                    //退出
                    System.out.println(loginAcc.getUserName() + "退出系统成功");
                    return;
                case 7:
                    //注销当前账户
                    if (deleteAccount()) {
                        return;
                    } else {
                        break;
                    }

                default:
                    System.out.println("当前输入的指令不存在");
            }
        }
    }
    /**修改密码*/
    private void changePassword() {
        System.out.println("===当前是修改密码操作===");
        while (true) {
            System.out.print("请输入当前密码：");
            String password = sc.next();

            //判断原密码是否正确
            while (true) {
                if (loginAcc.getPassword().equals(password)){
                    System.out.println("请您输入新密码");
                    String newPassword = sc.next();

                    System.out.println("请您再次输入新密码");
                    String okPassword = sc.next();

                    if (okPassword.equals(newPassword)){
                        loginAcc.setPassword(newPassword);
                        System.out.println("密码修改成功，请重新登录");
                        return;
                    }else {
                        System.out.println("两次新密码输入的新密码不相同，请重新输入新密码");
                    }

                }else {
                    System.out.println("原密码错误");
                }
            }
        }


    }

    /**销户*/
    private boolean deleteAccount() {
        System.out.println("===当前是销户操作===");

        System.out.println("请问您确认销户吗？y/n");
        String command = sc.next();
        switch(command){
            case "y":

                //判断有存款吗
                if (loginAcc.getMoney() == 0){
                    accounts.remove(loginAcc);
                    System.out.println("销户操作成功");
                    return true;
                }else {
                    System.out.println("您的账户还有余额，不允许销户");
                    return false;
                }
            default:
                System.out.println("销户操作已取消");
                return false;
        }
    }

    /**转账*/
    private void transferMoney() {
        System.out.println("===当前是转账操作===");

        if (accounts.size() < 2){
            System.out.println("当前系统中只有您一个账户，暂时无法转账");
            return;
        }

        if (loginAcc.getMoney() == 0){
            System.out.println("您自己都没钱了。别转了");
            return;
        }


        while (true) {
            System.out.print("请输入对方的卡号：");
            String cardId = sc.next();

            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                System.out.println("您输入的对方的卡号不存在");
            }else {
                if (loginAcc.getCardId().equals(cardId)) {
                    System.out.println("您不可以给自己转钱");
                    return;
                } else {
                    String name = "*" + acc.getUserName().substring(1);
                    System.out.println("请您输入【" + name + "】的姓氏");
                    String preName = sc.next();

                    //判断姓氏是否正确
                    if (acc.getUserName().startsWith(preName)) {
                        while (true) {
                            System.out.print("请您输入要转给对方的金额：");
                            double money = sc.nextDouble();
                            if (loginAcc.getMoney() >= money) {
                                //可以转账
                                loginAcc.setMoney(loginAcc.getMoney() - money);
                                acc.setMoney(acc.getMoney() + money);
                                System.out.println("恭喜您转账成功");
                                return;
                            } else {
                                System.out.println("您的余额不足，您当前余额为：" + loginAcc.getMoney());
                            }
                        }
                    } else {
                        System.out.println("您输入对方的姓氏不对");
                    }
                }
            }
        }
    }

    /**取钱*/
    private void drawMoney() {
        System.out.println("===当前是取钱操作===");
        System.out.println("您当前余额为" + loginAcc.getMoney());
        if (loginAcc.getMoney() < 100){
            System.out.println("您的账户余额不足100元，无法在ATM机中取款~~");
            return;
        }

        while (true) {
            System.out.print("请您输入取款金额：");
            double money = sc.nextDouble();

            if (loginAcc.getMoney() >= money){
                //判断是否超过限额
                if (money > loginAcc.getLimit()){
                    System.out.println("您的取款金额超过取款限额，限额为" + loginAcc.getLimit());
                    System.out.println("输入以下功能对应的代码进行下一步操作");
                    System.out.println("1、重新输入取款金额");
                    System.out.println("2、取消取款");
                    System.out.print("请输入：");
                    int command = sc.nextInt();
                    switch(command){
                        case 1:
                            break;
                        case 2:
                            return;
                    }
                }else{
                    loginAcc.setMoney(loginAcc.getMoney() - money);
                    System.out.println("取款"+ money + "元人名币成功，取款后您的余额为" + loginAcc.getMoney() + "元");
                    break;
                }
            }else {
                System.out.println("余额不足，请重新输入取款金额");
                System.out.println("输入以下功能对应的代码进行下一步操作");
                System.out.println("1、重新输入取款金额");
                System.out.println("2、取消取款");
                System.out.print("请输入：");
                int command = sc.nextInt();
                switch(command){
                    case 1:
                        break;
                    case 2:
                        return;
                }
            }
        }

    }




    /**存钱*/
    private void depositMoney() {
        System.out.println("===当前是存钱操作===");
        System.out.print("请您输入存款金额：");
        double money = sc.nextDouble();

        //更新当前余额
        loginAcc.setMoney(loginAcc.getMoney() + money);
        System.out.println("恭喜您，存钱" + money +"成功，您当前余额位" + loginAcc.getMoney());
    }

    /**展示当前账户的登录信息*/
    private void showLoginAccount(){
        System.out.println("====当前您的账户信息如下====");
        System.out.println("卡号：" + loginAcc.getCardId());
        System.out.println("户主：" + loginAcc.getUserName());
        System.out.println("性别：" + loginAcc.getSex());
        System.out.println("余额：" + loginAcc.getMoney());
        System.out.println("每次取现额度：" + loginAcc.getLimit());
        System.out.println("====当前您的账户信息如上====");
    }


    /**开户*/
    private void createAccount() {
        System.out.println("====欢迎开户====");
        //1.创建一个账户对象，用于封装用户的开户信息
        Account acc = new Account();

        //2.需要用户输入自己的开户信息，赋值给账户对象
        System.out.println("请输入您的账户名称：");
        String name  = sc.next();
        acc.setUserName(name);

        while (true) {
            System.out.println("请输入您的性别：");
            char sex = sc.next().charAt(0);  //获取用户输入字符串的第一个字符作为性别信息。
            //判断性别是否合法
            if (sex == '男' || sex == '女'){
                acc.setSex(sex);
                break;
            }else {
                System.out.println("您输入的性别有误，只能是男或女,请再次输入性别");
            }
        }

        while (true) {
            System.out.println("请您输入您的账户密码");
            String password = sc.next();
            System.out.println("请确认您的密码");
            String okPassword = sc.next();

            //判断两次密码是否一样
            if (okPassword.equals(password)){
                acc.setPassword(okPassword);
                break;
            }else {
                System.out.println("两次输入的密码不一致，请重新设置密码");
            }
        }


        System.out.println("请您输入您的取现额度：");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        //生成唯一卡号
        String newCradId = createCardId();
        acc.setCardId(newCradId);
        //3.把这个账户对象存入到账户集合中
        accounts.add(acc);
        System.out.println("恭喜您" + acc.getUserName() + "开户成功，请记住您的卡号" + acc.getCardId() );
    }


    /**生成唯一8位卡号*/
    private String createCardId(){
        while (true) {
            //1.定义一个String类型的变量记住8位数字卡号
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i <8; i++) {
                int data = r.nextInt(10);
                cardId += data;
            }
            Account acc = getAccountByCardId(cardId);
            if (acc == null){
                return cardId;
            }
        }
    }


    /**根据卡号查询账户对象*/
    private Account getAccountByCardId(String cardId){
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return null;
    }













}
